package com.edu.learning.singleton;

/**
 * 使用双重检查锁定机制
 * 由于Java编译器和JIT的优化的原因系统无法保证期望的执行次序。
 * 在Java5.0修改了内存模型，使用volatile声明的变量可以强制屏蔽编译器和JIT优化工作
 *
 * @author ll
 * @Date 2018/1/8 20:10
 */
public class DoubleCheckedLockingSingleton {

    private volatile static DoubleCheckedLockingSingleton uniqueInstance;

    private DoubleCheckedLockingSingleton() {
    }

    public static DoubleCheckedLockingSingleton getInstance() {
        if (uniqueInstance == null) {
            synchronized (DoubleCheckedLockingSingleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new DoubleCheckedLockingSingleton();
                }
            }
        }
        return uniqueInstance;
    }
}
